#ifndef EBCOT_H
#define EBCOT_H

#include <stdio.h>
#include "Mascara.h"
#include "Bloque.h"


#define ZC0 0
#define ZC1 1
#define ZC2 2
#define ZC3 3
#define ZC4 4
#define ZC5 5
#define ZC6 6
#define ZC7 7
#define ZC8 8
#define SC0 9
#define SC1 10
#define SC2 11
#define SC3 12
#define SC4 13
#define MR0 14
#define MR1 15
#define MR2 16

#define SAL2    //SAL1 --> Salida ejemplo
                //SAL2 --> Salida completo



typedef struct t_Info
{
    int h,v,d,sH,sV;
    bool fRef;
    int signif; //0 = no signif; 1 = signif en este plano de bit ; 2 = signif en planos anteriores.

    t_Info() { h = v = d = sH = sV = signif = 0;
    fRef = false;}
} Info;




class Ebcot
{
    public:
        Ebcot();
        ~Ebcot();

        int codifica(const char*,int);
        int decodifica(const char*, int);

    protected:
    private:

        Bloque bloque;
        Mascara mascaraPropagacion;
        Mascara mascaraRefinamiento;
        Mascara mascaraLimpieza;
        Mascara mascaraSigno;       //Mascara para indicar el signo de los coeficientes negativos
        Info info [64][64];

        int contEsc;


        int bitPlaneActual;
        int obtenerNumeroBitplanes();

        int Propagacion();
        void PropagacionDec(int);
        int Limpieza();
        void LimpiezaDec(int);
        int Refinamiento();
        void RefinamientoDec(int);
        int zeroContext(int,int);
        int signContext(int,int,int*);
        int signContextDec(int,int,int*);
        int obtenerBit(int i, int j);
        void marcarVecino(int,int);
        void reset();
        void actualizaSignif();
        int signo(int);
        void ajustaSigno();
        void anyadeSignificativo(int i,int j); // solo marca los bits significativos que encontramos durante propagacion (codificacion) //los grises vamos
        void EscribirCabecera();

        //DEBUG
        void printInfo();
};

#endif // EBCOT_H
